package config

import (
	"api/public/global"
	"fmt"
	"gitee.com/dreamwood/ez"
	"gorm.io/driver/mysql"
	"gorm.io/gorm"
	"gorm.io/gorm/logger"
	"gorm.io/gorm/schema"
	"time"
)

var db *gorm.DB

type MysqlConfig struct {
	Dsn        string        `yaml:"dsn"`
	LogLevel   string        `yaml:"log-level"`
	LogTo      string        `yaml:"log-to"`
	FilePath   string        `yaml:"file"`
	MaxOpen    int           `yaml:"max-open"`
	MaxOpenSec time.Duration `yaml:"max-open-sec"`
	MaxIdle    int           `yaml:"max-idle"`
	MaxIdleSec time.Duration `yaml:"max-idle-sec"`
}

func InitMysql() {
	ez.Debug("MYSQL 开始初始化")
	mc := new(MysqlConfig)
	ez.CreateConfigFromYml("./app.yaml", "mysql", &mc)
	ez.Debug(fmt.Sprintf("数据库链接DSN：%s", mc.Dsn))
	logLevel := logger.Silent
	switch mc.LogLevel {
	case "Error":
		logLevel = logger.Error
	case "Warn":
		logLevel = logger.Warn
	case "Info":
		logLevel = logger.Info
	}

	ezLogger := ez.CreateLogger()
	switch mc.LogTo {
	case "Nsq":
		ezLogger.NsqPubAddr = GetCore().NsqPubAddr
		ezLogger.InitMqLogger()
		ezLogger.UseMqLogger()
	case "Console":
		ezLogger.InitConsoleLogger()
		ezLogger.UseConsoleLogger()

	case "File":
		ezLogger.FilePath = mc.FilePath
		ezLogger.InitFileLogger()
		ezLogger.UseFileLogger()
	default:
		ezLogger.UseNoLogger()
	}
	myLog := logger.New(ezLogger, logger.Config{
		SlowThreshold:             200 * time.Millisecond,
		LogLevel:                  logLevel,
		IgnoreRecordNotFoundError: false,
		Colorful:                  false,
	})

	gormDB, err := gorm.Open(mysql.New(mysql.Config{
		DSN:                       mc.Dsn,
		DefaultStringSize:         256,   // string 类型字段的默认长度
		DisableDatetimePrecision:  false, // 禁用 datetime 精度，MySQL 5.6 之前的数据库不支持
		DontSupportRenameIndex:    true,  // 重命名索引时采用删除并新建的方式，MySQL 5.7 之前的数据库和 MariaDB 不支持重命名索引
		DontSupportRenameColumn:   true,  // 用 `change` 重命名列，MySQL 8 之前的数据库和 MariaDB 不支持重命名列
		SkipInitializeWithVersion: false, // 根据当前 MySQL 版本自动配置
	}), &gorm.Config{
		NamingStrategy: schema.NamingStrategy{
			SingularTable: true,
		},
		Logger: myLog,
	})
	if err != nil {
		ez.Debug(fmt.Sprintf("gorm数据库初始化失败:%s", err.Error()))
		return
	}
	sqlDB, err := gormDB.DB()
	if err != nil {
		ez.Debug(fmt.Sprintf("gorm连接池获取失败:%s", err.Error()))
		return
	}
	if sqlDB != nil {
		sqlDB.SetConnMaxIdleTime(mc.MaxIdleSec * time.Second)
		sqlDB.SetConnMaxLifetime(mc.MaxOpenSec * time.Second)
		sqlDB.SetMaxIdleConns(mc.MaxIdle)
		sqlDB.SetMaxOpenConns(mc.MaxOpen)
	}
	db = gormDB
	global.DB = gormDB
	ez.Debug("MYSQL 初始化完成")
}

// GetDb 在test或者其不能初始化mysql的场景使用
func GetDb() *gorm.DB {
	if db == nil {
		InitMysql()
	}
	return db
}
